home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 426-450 / disk_438 / toollib / source / freq.s < prev    next >
Text File  |  1992-05-06  |  59KB  |  2,082 lines

  1.         opt     l+,o+,ow-
  2. *
  3. * freq.s version 7.6 - © Copyright 1990 Jaba Development
  4. *
  5. * Author    : Jan van den Baard
  6. * Assembler : Devpac version 2.14
  7. *
  8.         incdir  'sys:devpac_inc/'
  9.         include 'tool.i'
  10.         include 'mymacros.i'
  11.         include 'exec/exec_lib.i'
  12.         include 'intuition/intuition_lib.i'
  13.         include 'graphics/graphics_lib.i'
  14.         include 'libraries/dos_lib.i'
  15. *
  16. * external symbol references
  17. *
  18.         xref    _DOSBase
  19.         xref    _IntuitionBase
  20.         xref    _GfxBase
  21.  
  22.         xref    ShadowGList
  23.         xref    InitMemoryChain
  24.         xref    AllocItem
  25.         xref    FreeItem
  26.         xref    FreeMemoryChain
  27.         xref    StrCpy
  28.         xref    StrLen
  29.         xref    StriCmp
  30.         xref    BstrToCstr
  31.         xref    MatchPattern
  32.         xref    Isolate
  33.         xref    CreateTimeDelay
  34.         xref    DoTimeDelay
  35.         xref    DeleteTimeDelay
  36.         xref    QuickSort
  37.         xref    OpenDir
  38.         xref    GetEntry
  39.         xref    CloseDir
  40.         xref    FreeDir
  41.         xref    IoErrToStr
  42.  
  43. *
  44. * This is the way data gets passed around ! This structure gets dynamicaly
  45. * allocated each time the filerequester is called.
  46. *
  47.     STRUCTURE    Global,0
  48.         APTR    gl_Freq
  49.         APTR    gl_WindowLock
  50.         APTR    gl_Window
  51.         APTR    gl_PRWindow
  52.         APTR    gl_RPort
  53.         APTR    gl_IAddress
  54.         APTR    gl_Prop
  55.         APTR    gl_FileG
  56.         APTR    gl_DirG
  57.         APTR    gl_Disk
  58.         APTR    gl_Drawer
  59.         APTR    gl_PInfo
  60.         APTR    gl_Font
  61.         APTR    gl_Proc
  62.         APTR    gl_FirstDisplayed
  63.         APTR    gl_TimeDelay
  64.         STRUCT  gl_Misc,mc_SIZEOF
  65.         ULONG   gl_IsNext
  66.         ULONG   gl_Displayed
  67.         ULONG   gl_Class
  68.         USHORT  gl_Code
  69.         USHORT  gl_Qualifier
  70.         USHORT  gl_Id
  71.         USHORT  gl_NumEntries
  72.         USHORT  gl_IsSorted
  73.         APTR    gl_FileBuf
  74.         APTR    gl_DrawerBuf
  75.         STRUCT  gl_Pattern,32
  76.         LABEL   gl_SIZEOF
  77.  
  78. *
  79. * Draw a box in a rastport.
  80. * This routine is used to draw the gadget and requester borders.
  81. *
  82. _Box:       movem.l d2-d6/a2/a6,-(sp)
  83.             move.l  32(sp),a2
  84.             movem.l 36(sp),d2-d6
  85.             move.l  _GfxBase,a6
  86.             move.l  a2,a1
  87.             move.l  d6,d0
  88.             libcall SetAPen
  89.             move.l  a2,a1
  90.             moveq   #RP_JAM1,d0
  91.             libcall SetDrMd
  92.             move.l  a2,a1
  93.             move.l  d2,d0
  94.             move.l  d3,d1
  95.             libcall Move
  96.             move.l  d2,d0
  97.             add.l   d4,d0
  98.             move.l  d3,d1
  99.             libcall Draw
  100.             move.l  d2,d0
  101.             add.l   d4,d0
  102.             move.l  d3,d1
  103.             add.l   d5,d1
  104.             libcall Draw
  105.             move.l  d2,d0
  106.             move.l  d3,d1
  107.             add.l   d5,d1
  108.             libcall Draw
  109.             move.l  d2,d0
  110.             move.l  d3,d1
  111.             libcall Draw
  112.             movem.l (sp)+,d2-d6/a2/a6
  113.             rts
  114. *
  115. * Print a text in a rastport.
  116. * This routine is used to print the gadget & requester texts.
  117. *
  118. _Print:     movem.l d2-d6/a2-a3/a6,-(sp)
  119.             movem.l 36(sp),a2-a3
  120.             movem.l 44(sp),d2-d6
  121.             move.l  _GfxBase,a6
  122.             move.l  a2,a1
  123.             move.l  d4,d0
  124.             libcall SetAPen
  125.             move.l  a2,a1
  126.             move.l  d5,d0
  127.             libcall SetBPen
  128.             move.l  a2,a1
  129.             move.l  d6,d0
  130.             libcall SetDrMd
  131.             move.l  a2,a1
  132.             move.l  d2,d0
  133.             move.l  d3,d1
  134.             addq.l  #6,d1
  135.             libcall Move
  136.             move.l  a2,a1
  137.             move.l  a3,a0
  138.             bsr     StrLen
  139.             move.l  a3,a0
  140.             libcall Text
  141.             movem.l (sp)+,d2-d6/a2/a3/a6
  142.             rts
  143. *
  144. * (re)set the user colors (only if FR_CustColor was set in the Flags field
  145. * of the FileRequester structure).
  146. *
  147. _DoColors:  movem.l d2-d5/a2-a3/a5/a6,-(sp)
  148.             move.l  36(sp),a2
  149.             move.l  gl_Window(a2),a0
  150.             move.l  _IntuitionBase,a6
  151.             libcall ViewPortAddress
  152.             move.l  d0,a3
  153.             move.l  gl_Freq(a2),a5
  154.             lea.l   fr_Color0(a5),a5
  155.             move.l  _GfxBase,a6
  156.             cldat   d4
  157. ColorLoop:  move.l  d4,d0
  158.             move.l  vp_ColorMap(a3),a0
  159.             libcall GetRGB4
  160.             move.l  d0,d5
  161.             move.l  d4,d0
  162.             add.l   d0,d0
  163.             cldat   d1
  164.             move.w  (a5,d0.l),d1
  165.             move.l  a3,a0
  166.             move.l  d1,d2
  167.             move.l  d1,d3
  168.             asr.l   #8,d1
  169.             asr.l   #4,d2
  170.             and.l   #15,d1
  171.             and.l   #15,d2
  172.             and.l   #15,d3
  173.             move.l  d4,d0
  174.             libcall SetRGB4
  175.             move.l  d4,d0
  176.             add.l   d0,d0
  177.             move.w  d5,(a5,d0.l)
  178.             inc.l   d4
  179.             cmp.l   #4,d4
  180.             beq.s   NoMoreCol
  181.             bra.s   ColorLoop
  182. NoMoreCol:  movem.l (sp)+,d2-d5/a2-a3/a5/a6
  183.             rts
  184. *
  185. * Open and setup the filerequester window.
  186. *
  187. _GetFSWindow:
  188.             movem.l d2-d3/a2-a3/a5-a6,-(sp)
  189.             move.l  28(sp),a2
  190.             move.l  #nw_SIZE,d0
  191.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  192.             lea.l   gl_Misc(a2),a0
  193.             bsr     AllocItem
  194.             move.l  d0,a5
  195.             bne.s   GotNW
  196. NoOpen:     cldat   d0
  197. EndGFSW:    movem.l (sp)+,d2-d3/a2-a3/a5-a6
  198.             rts
  199. GotNW:      lea.l   fsnw,a0
  200.             move.l  a5,a1
  201.             move.l  #nw_SIZE,d0
  202.             libcall CopyMem
  203.             move.l  gl_Freq(a2),a0
  204.             move.w  fr_LeftEdge(a0),d0
  205.             move.w  d0,nw_LeftEdge(a5)
  206.             move.w  fr_TopEdge(a0),d0
  207.             move.w  d0,nw_TopEdge(a5)
  208.             move.l  fr_Screen(a0),d0
  209.             move.l  d0,nw_Screen(a5)
  210.             beq.s   NoScreen
  211.             move.w  #CUSTOMSCREEN,nw_Type(a5)
  212.             bra.s   HaveScreen
  213. NoScreen:   move.w  #WBENCHSCREEN,nw_Type(a5)
  214. HaveScreen: lea.l   TOPAZ_80,a0
  215.             move.l  _GfxBase,a6
  216.             libcall OpenFont
  217.             move.l  d0,gl_Font(a2)
  218.             move.l  a5,a0
  219.             move.l  _IntuitionBase,a6
  220.             libcall OpenWindow
  221.             move.l  d0,-(sp)
  222.             move.l  a5,a1
  223.             move.l  #nw_SIZE,d0
  224.             lea.l   gl_Misc(a2),a0
  225.             bsr     FreeItem
  226.             move.l  (sp)+,d0
  227.             tst.l   d0
  228.             bne.s   OpenOK
  229.             bra.s   NoOpen
  230. OpenOK:     move.l  d0,gl_Window(a2)
  231.             move.l  gl_Freq(a2),a0
  232.             move.w  fr_Flags(a0),d0
  233.             btst    #3,d0
  234.             beq.s   NoCols
  235.             move.l  a2,-(sp)
  236.             bsr     _DoColors
  237.             addq.w  #4,sp
  238. NoCols:     move.l  gl_Window(a2),a0
  239.             move.l  wd_RPort(a0),a3
  240.             move.l  a3,gl_RPort(a2)
  241.             move.l  a3,a1
  242.             move.l  gl_Font(a2),a0
  243.             move.l  _GfxBase,a6
  244.             libcall SetFont
  245.             move.l  a2,-(sp)
  246.             move.l  gl_Window(a2),a0
  247.             move.l  gl_Freq(a2),a1
  248.             move.l  fr_HeadLine(a1),a1
  249.             move.l  #-1,a2
  250.             move.l  _IntuitionBase,a6
  251.             libcall SetWindowTitles
  252.             move.l  (sp)+,a2
  253.             move.l  _GfxBase,a6
  254.             move.l  a3,a1
  255.             moveq   #1,d0
  256.             libcall SetAPen
  257.             move.l  a3,a0
  258.             cldat   d0
  259.             move.l  #10,d1
  260.             move.l  #260,d2
  261.             move.l  #140,d3
  262.             libcall RectFill
  263.             pea     2
  264.             pea     44
  265.             pea     253
  266.             pea     93
  267.             pea     3
  268.             move.l  a3,-(sp)
  269.             bsr     _Box
  270.             lea.l   24(sp),sp
  271.             pea     2
  272.             pea     81
  273.             pea     21
  274.             pea     11
  275.             pea     235
  276.             move.l  a3,-(sp)
  277.             bsr     _Box
  278.             lea.l   24(sp),sp
  279.             pea     0
  280.             pea     59
  281.             pea     15
  282.             pea     22
  283.             pea     238
  284.             move.l  a3,-(sp)
  285.             bsr     _Box
  286.             lea.l   24(sp),sp
  287.             pea     2
  288.             pea     81
  289.             pea     231
  290.             pea     11
  291.             pea     3
  292.             move.l  a3,-(sp)
  293.             bsr     _Box
  294.             lea.l   24(sp),sp
  295.             pea     2
  296.             pea     128
  297.             pea     255
  298.             pea     10
  299.             pea     2
  300.             move.l  a3,-(sp)
  301.             bsr     _Box
  302.             lea.l   24(sp),sp
  303.             pea     2
  304.             pea     12
  305.             pea     69
  306.             pea     121
  307.             pea     179
  308.             move.l  a3,-(sp)
  309.             bsr     _Box
  310.             lea.l   24(sp),sp
  311.             pea     2
  312.             pea     12
  313.             pea     69
  314.             pea     121
  315.             pea     95
  316.             move.l  a3,-(sp)
  317.             bsr     _Box
  318.             lea.l   24(sp),sp
  319.             pea     2
  320.             pea     12
  321.             pea     69
  322.             pea     121
  323.             pea     11
  324.             move.l  a3,-(sp)
  325.             bsr     _Box
  326.             lea.l   24(sp),sp
  327.             pea     2
  328.             pea     9
  329.             pea     185
  330.             pea     108
  331.             pea     63
  332.             move.l  a3,-(sp)
  333.             bsr     _Box
  334.             lea.l   24(sp),sp
  335.             pea     2
  336.             pea     9
  337.             pea     185
  338.             pea     96
  339.             pea     63
  340.             move.l  a3,-(sp)
  341.             bsr     _Box
  342.             lea.l   24(sp),sp
  343.             pea     0
  344.             pea     0
  345.             pea     2
  346.             pea     124
  347.             pea     191
  348.             pea     cancel
  349.             move.l  a3,-(sp)
  350.             bsr     _Print
  351.             lea.l   28(sp),sp
  352.             pea     0
  353.             pea     0
  354.             pea     2
  355.             pea     124
  356.             pea     107
  357.             pea     parent
  358.             move.l  a3,-(sp)
  359.             bsr     _Print
  360.             lea.l   28(sp),sp
  361.             pea     0
  362.             pea     0
  363.             pea     2
  364.             pea     124
  365.             pea     38
  366.             pea     oktext
  367.             move.l  a3,-(sp)
  368.             bsr     _Print
  369.             lea.l   28(sp),sp
  370.             pea     0
  371.             pea     0
  372.             pea     2
  373.             pea     109
  374.             pea     11
  375.             pea     file
  376.             move.l  a3,-(sp)
  377.             bsr     _Print
  378.             lea.l   28(sp),sp
  379.             pea     0
  380.             pea     0
  381.             pea     2
  382.             pea     97
  383.             pea     11
  384.             pea     drawer
  385.             move.l  a3,-(sp)
  386.             bsr     _Print
  387.             lea.l   28(sp),sp
  388.             move.l  a2,-(sp)
  389.             bsr     _DoGadgets
  390.             addq.w  #4,sp
  391.             tst.l   d0
  392.             bne.s   GadgetsOK
  393.             move.l  gl_Window(a2),a0
  394.             move.l  _IntuitionBase,a6
  395.             libcall CloseWindow
  396.             bra     NoOpen
  397. GadgetsOK:  cladr   a1
  398.             move.l  _SysBase,a6
  399.             libcall FindTask
  400.             move.l  d0,a0
  401.             move.l  pr_WindowPtr(a0),gl_PRWindow(a2)
  402.             move.l  gl_Window(a2),pr_WindowPtr(a0)
  403.             move.l  a0,gl_Proc(a2)
  404.             moveq   #1,d0
  405.             bra     EndGFSW
  406.  
  407. *
  408. * allocate and setup the requester gadgets
  409. *
  410. _DoGadgets: movem.l d2-d7/a2-a3/a6,-(sp)
  411.             move.l  40(sp),a2
  412.             lea.l   gl_Misc(a2),a3
  413.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  414.             move.l  #16*gg_SIZEOF,d0
  415.             move.l  a3,a0
  416.             bsr     AllocItem
  417.             move.l  d0,d2
  418.             beq     NoMemory
  419.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  420.             move.l  #5*ig_SIZEOF,d0
  421.             move.l  a3,a0
  422.             bsr     AllocItem
  423.             move.l  d0,d3
  424.             beq     NoMemory
  425.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  426.             moveq   #pi_SIZEOF,d0
  427.             move.l  a3,a0
  428.             bsr     AllocItem
  429.             move.l  d0,d4
  430.             beq     NoMemory
  431.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  432.             move.l  #2*si_SIZEOF,d0
  433.             move.l  a3,a0
  434.             bsr     AllocItem
  435.             move.l  d0,d5
  436.             beq     NoMemory
  437.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  438.             move.l  #256,d0
  439.             move.l  a3,a0
  440.             bsr     AllocItem
  441.             move.l  d0,d6
  442.             beq     NoMemory
  443.             move.l  #MEMF_CHIP+MEMF_CLEAR,d1
  444.             move.l  #176,d0
  445.             move.l  a3,a0
  446.             bsr     AllocItem
  447.             move.l  d0,d7
  448.             beq     NoMemory
  449.             move.l  (_SysBase).w,a6
  450.             lea.l   FSG,a0
  451.             move.l  d2,a1
  452.             move.l  #8*gg_SIZEOF,d0
  453.             libcall CopyMem
  454.             cldat   d0
  455.             move.l  d2,a0
  456. GLoop1:     move.l  a0,gg_NextGadget(a0)
  457.             add.l   #gg_SIZEOF,gg_NextGadget(a0)
  458.             add.l   #gg_SIZEOF,a0
  459.             inc.l   d0
  460.             cmp.l   #8,d0
  461.             bne.s   GLoop1
  462.             move.w  #12,d1
  463. GLoop2:     movem.l d0/d1/a0,-(sp)
  464.             move.l  a0,a1
  465.             lea.l   FGAD,a0
  466.             move.l  #gg_SIZEOF,d0
  467.             libcall CopyMem
  468.             movem.l (sp)+,d0/d1/a0
  469.             move.l  a0,gg_NextGadget(a0)
  470.             add.l   #gg_SIZEOF,gg_NextGadget(a0)
  471.             move.w  d1,gg_TopEdge(a0)
  472.             addq.w  #2,d1
  473.             addq.w  #8,d1
  474.             move.w  d0,gg_GadgetID(a0)
  475.             add.l   #gg_SIZEOF,a0
  476.             inc.l   d0
  477.             cmp.l   #16,d0
  478.             bne.s   GLoop2
  479.             clr.l   gg_NextGadget(a0)
  480.             lea.l   FSI,a0
  481.             move.l  d3,a1
  482.             move.l  #ig_SIZEOF*4,d0
  483.             libcall CopyMem
  484.             lea.l   FSD,a0
  485.             move.l  d7,a1
  486.             move.l  #176,d0
  487.             libcall CopyMem
  488.             move.l  d3,a0
  489.             move.l  d7,ig_ImageData(a0)
  490.             add.l   #ig_SIZEOF,a0
  491.             move.l  d7,d0
  492.             add.l   #16,d0
  493.             move.l  d0,ig_ImageData(a0)
  494.             add.l   #ig_SIZEOF,a0
  495.             move.l  d7,d0
  496.             add.l   #80,d0
  497.             move.l  d0,ig_ImageData(a0)
  498.             add.l   #ig_SIZEOF,a0
  499.             move.l  d7,d0
  500.             add.l   #32,d0
  501.             move.l  d0,ig_ImageData(a0)
  502.             move.l  d3,d0
  503.             add.l   #2*ig_SIZEOF,d0
  504.             move.l  d0,gl_Disk(a2)
  505.             add.l   #ig_SIZEOF,d0
  506.             move.l  d0,gl_Drawer(a2)
  507.             move.l  d2,a0
  508.             add.l   #6*gg_SIZEOF,a0
  509.             move.l  d3,gg_GadgetRender(a0)
  510.             add.l   #gg_SIZEOF,a0
  511.             move.l  d3,d0
  512.             add.l   #ig_SIZEOF,d0
  513.             move.l  d0,gg_GadgetRender(a0)
  514.             move.l  d5,a0
  515.             move.l  d6,si_UndoBuffer(a0)
  516.             move.l  gl_DrawerBuf(a2),d0
  517.             move.l  d0,si_Buffer(a0)
  518.             move.w  #256,si_MaxChars(a0)
  519.             add.l   #si_SIZEOF,a0
  520.             move.l  d6,si_UndoBuffer(a0)
  521.             move.l  gl_FileBuf(a2),d0
  522.             move.l  d0,si_Buffer(a0)
  523.             move.w  #32,si_MaxChars(a0)
  524.             move.l  d2,a0
  525.             add.l   #3*gg_SIZEOF,a0
  526.             move.l  d5,d0
  527.             add.l   #si_SIZEOF,d0
  528.             move.l  d0,gg_SpecialInfo(a0)
  529.             move.l  a0,gl_FileG(a2)
  530.             add.l   #gg_SIZEOF,a0
  531.             move.l  d5,gg_SpecialInfo(a0)
  532.             move.l  a0,gl_DirG(a2)
  533.             lea.l   PINFO,a0
  534.             move.l  d4,a1
  535.             move.l  #pi_SIZEOF,d0
  536.             libcall CopyMem
  537.             move.l  d2,a0
  538.             add.l   #5*gg_SIZEOF,a0
  539.             move.l  d4,gg_SpecialInfo(a0)
  540.             move.l  d3,d0
  541.             add.l   #4*ig_SIZEOF,d0
  542.             move.l  d0,gg_GadgetRender(a0)
  543.             move.l  a0,gl_Prop(a2)
  544.             move.l  d4,gl_PInfo(a2)
  545.             move.l  a2,-(sp)
  546.             move.l  gl_Window(a2),a0
  547.             move.l  d2,a1
  548.             move.l  #-1,d0
  549.             move.l  #16,d1
  550.             cladr   a2
  551.             move.l  _IntuitionBase,a6
  552.             libcall AddGList
  553.             move.l  d2,a0
  554.             move.l  (sp),a1
  555.             move.l  gl_Window(a1),a1
  556.             cladr   a2
  557.             moveq   #8,d0
  558.             libcall RefreshGList
  559.             move.l  (sp)+,a2
  560.             moveq   #3,d1
  561.             cldat   d0
  562.             move.l  gl_Window(a2),a0
  563.             cladr   a2
  564.             move.l  d2,a1
  565.             bsr     ShadowGList
  566.             moveq   #1,d0
  567. EndDG:      movem.l (sp)+,d2-d7/a2-a3/a6
  568.             rts
  569. NoMemory:   lea.l   gl_Misc(a2),a0
  570.             bsr     FreeMemoryChain
  571.             cldat   d0
  572.             bra.s   EndDG
  573. *
  574. * calculate the prop position
  575. *
  576. _PPos:      movem.l d2/a2,-(sp)
  577.             move.l  12(sp),a2
  578.             move.l  gl_PInfo(a2),a0
  579.             cldat   d0
  580.             move.w  pi_VertPot(a0),d0
  581.             divs    pi_VertBody(a0),d0
  582.             swap    d0
  583.             clr.w   d0
  584.             swap    d0
  585.             move.l  d0,d2
  586.             addq.l  #7,d0
  587.             cldat   d1
  588.             move.w  gl_NumEntries(a2),d1
  589.             cmp.l   d1,d0
  590.             ble.s   CheckZero
  591.             subq.l  #8,d1
  592.             move.l  d1,d2
  593. CheckZero:  tst.l   d2
  594.             bge.s   NotZero
  595.             cldat   d2
  596. NotZero:    move.l  d2,d0
  597.             movem.l (sp)+,d2/a2
  598.             rts
  599. *
  600. * read an IDCMP message
  601. * return TRUE if a message was read and FALSE if not
  602. *
  603. _DoMsg:     movem.l a2-a3/a6,-(sp)
  604.             move.l  16(sp),a2
  605.             move.l  gl_Window(a2),a0
  606.             move.l  wd_UserPort(a0),a0
  607.             move.l  (_SysBase).w,a6
  608.             libcall GetMsg
  609.             move.l  d0,a3
  610.             tst.l   d0
  611.             bne.s   HaveMsg
  612.             cldat   d0
  613. EndDM:      movem.l (sp)+,a2-a3/a6
  614.             rts
  615. HaveMsg:    move.l  im_Class(a3),gl_Class(a2)
  616.             move.w  im_Code(a3),gl_Code(a2)
  617.             move.w  im_Qualifier(a3),gl_Qualifier(a2)
  618.             move.l  im_IAddress(a3),a0
  619.             move.l  a0,gl_IAddress(a2)
  620.             move.w  gg_GadgetID(a0),gl_Id(a2)
  621.             move.l  a3,a1
  622.             libcall ReplyMsg
  623.             moveq   #1,d0
  624.             bra.s   EndDM
  625. *
  626. * sort the names from the files, dirs and devices
  627. *
  628. _SortNames: movem.l d2-d5/a2/a6,-(sp)
  629.             move.l  28(sp),a2
  630.             move.l  dr_NumEntries(a2),d2        ; number of entries in d2
  631.             cmp.l   #1,d2                       ; only sort if bigger than 1
  632.             bhi.s   NotEmpty
  633. NoSRT:      cldat   d0
  634. EndSN:      movem.l (sp)+,d2-d5/a2/a6
  635.             rts
  636. NotEmpty:   moveq   #ei_SIZEOF-8,d5
  637.             mulu    d2,d5                       ; allocate buffer
  638. SetUp:      move.l  (_SysBase).w,a6
  639.             move.l  d5,d0
  640.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  641.             libcall AllocMem
  642.             move.l  d0,d3
  643.             move.l  d0,d4
  644.             bne.s   GotMem
  645.             bra.s   NoSRT
  646. GotMem:     move.l  dr_First(a2),a0
  647. MemLoop:    move.l  a0,-(sp)
  648.             addq.w  #8,a0                       ; skip the list muck!
  649.             move.l  d4,a1
  650.             move.l  #ei_SIZEOF-8,d0
  651.             libcall CopyMem
  652.             move.l  (sp)+,a0
  653.             cmp.l   dr_Last(a2),a0
  654.             beq.s   AllCopied
  655.             move.l  ei_Next(a0),a0
  656.             add.l   #ei_SIZEOF-8,d4
  657.             bra.s   MemLoop
  658. AllCopied:  lea.l   _compare,a1
  659.             moveq   #ei_SIZEOF-8,d1
  660.             move.l  d2,d0
  661.             move.l  d3,a0
  662.             bsr     QuickSort                   ; sort it out
  663.             move.l  d3,d4
  664.             move.l  dr_First(a2),a1
  665. BackLoop:   move.l  a1,-(sp)
  666.             addq.w  #8,a1
  667.             move.l  d4,a0
  668.             move.l  #ei_SIZEOF-8,d0
  669.             libcall CopyMem
  670.             move.l  (sp)+,a1
  671.             cmp.l   dr_Last(a2),a1
  672.             beq.s   AllBack
  673.             move.l  ei_Next(a1),a1
  674.             add.l   #ei_SIZEOF-8,d4
  675.             bra.s   BackLoop
  676. AllBack:    move.l  d3,a1
  677.             move.l  d5,d0
  678.             libcall FreeMem
  679.             moveq   #1,d0
  680.             bra     EndSN
  681.  
  682. *
  683. * the comparrison routine for "QuickSort"
  684. *
  685. _compare:   movem.l a2-a3,-(sp)
  686.             move.l  12(sp),a2
  687.             move.l  16(sp),a3
  688.             cmp.w   #ENTRY_DEV,ei_Type-8(a2)
  689.             bne.s   NotDev
  690.             cmp.w   #ENTRY_DEV,ei_Type-8(a3)
  691.             bne.s   Minus
  692. NotDev:     cmp.w   #ENTRY_DIR,ei_Type-8(a2)
  693.             bne.s   NotDir
  694.             cmp.w   #ENTRY_DIR,ei_Type-8(a3)
  695.             bne.s   Plus
  696. NotDir:     cmp.w   #ENTRY_FILE,ei_Type-8(a2)
  697.             bne.s   NotFile
  698.             cmp.w   #ENTRY_DEV,ei_Type-8(a3)
  699.             beq.s   Plus
  700. NotFile:    cmp.w   #ENTRY_FILE,ei_Type-8(a2)
  701.             bne.s   StrCMP
  702.             cmp.w   #ENTRY_DIR,ei_Type-8(a3)
  703.             beq.s   Minus
  704. StrCMP:     lea.l   ei_Name-8(a2),a0
  705.             lea.l   ei_Name-8(a3),a1
  706.             bsr     StriCmp
  707. Endcp:      movem.l (sp)+,a2-a3
  708.             rts
  709. Minus:      moveq   #-1,d0
  710.             bra.s   Endcp
  711. Plus:       moveq   #1,d0
  712.             bra.s   Endcp
  713.  
  714. *
  715. * read the mounted disk devices
  716. *
  717. _ReadDevs:  movem.l d2-d3/a2-a3/a6,-(sp)
  718.             move.l  24(sp),a2
  719.             cldat   d2
  720.             move.l  (_SysBase).w,a6
  721.             libcall Forbid
  722.             move.l  _DOSBase,a3
  723.             move.l  dl_Root(a3),a3
  724.             move.l  rn_Info(a3),a3
  725.             add.l   a3,a3
  726.             add.l   a3,a3
  727.             move.l  di_DevInfo(a3),a3
  728.             add.l   a3,a3
  729.             add.l   a3,a3
  730. DevLoop:    tst.l   dl_Type(a3)
  731.             bne.s   NotDisk
  732.             tst.l   dl_Task(a3)
  733.             beq.s   NotDisk
  734.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  735.             moveq   #ei_SIZEOF,d0
  736.             lea.l   dr_DirMem(a2),a0
  737.             bsr     AllocItem
  738.             move.l  d0,a1
  739.             beq.s   MemFail
  740.             move.l  d0,d3
  741.             inc.w   d2
  742.             lea.l   ei_Name(a1),a1
  743.             move.l  dl_Name(a3),a0
  744.             bsr     BstrToCstr
  745.             move.l  d3,a1
  746.             lea.l   ei_Name(a1),a0
  747. ELoop:      tst.b   (a0)+
  748.             bne.s   ELoop
  749.             dec.w   a0
  750.             move.b  #':',(a0)+
  751.             clr.b   (a0)
  752.             move.w  #ENTRY_DEV,ei_Type(a1)
  753.             inc.l   dr_NumEntries(a2)
  754.             move.l  a2,a0
  755.             move.l  d3,a1
  756.             ADDTAIL
  757. NotDisk:    move.l  dl_Next(a3),a3
  758.             exg     a3,d0
  759.             lsl.l   #2,d0
  760.             tst.l   d0
  761.             beq.s   NoMoreDevs
  762.             exg     d0,a3
  763.             bra.s   DevLoop
  764. NoMoreDevs: move.l  (_SysBase).w,a6
  765.             libcall Permit
  766.             move.l  d2,d0
  767. EndRD:      movem.l (sp)+,d2-d3/a2-a3/a6
  768.             rts
  769. MemFail:    move.l  (_SysBase).w,a6
  770.             libcall Permit
  771.             cldat   d0
  772.             bra.s   EndRD
  773.  
  774. *
  775. * put up a requester with an error message
  776. *
  777. _Error:     movem.l d2-d3/a2-a3/a6,-(sp)
  778.             move.l  (_SysBase).w,a6
  779.             move.l  #it_SIZEOF,d0
  780.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  781.             libcall AllocMem
  782.             move.l  d0,a0
  783.             bne.s   DoErr
  784. EndE:       movem.l (sp)+,d2-d3/a2-a3/a6
  785.             rts
  786. DoErr:      move.w  #6,it_LeftEdge(a0)
  787.             move.w  #4,it_TopEdge(a0)
  788.             lea.l   TOPAZ_80,a1
  789.             move.l  a1,it_ITextFont(a0)
  790.             move.l  a0,-(sp)
  791.             move.l  32(sp),a2
  792.             bne.s   DoReq
  793.             bsr     IoErrToStr
  794.             move.l  d0,a2
  795. DoReq:      move.l  (sp),a1
  796.             move.l  a2,it_IText(a1)
  797.             move.l  28(sp),a0
  798.             move.l  gl_Window(a0),a0
  799.             cladr   a2
  800.             lea.l   ok,a3
  801.             cldat   d0
  802.             cldat   d1
  803.             move.l  #320,d2
  804.             move.l  #47,d3
  805.             move.l  _IntuitionBase,a6
  806.             libcall AutoRequest
  807.             move.l  (sp)+,a1
  808.             move.l  #it_SIZEOF,d0
  809.             move.l  (_SysBase).w,a6
  810.             libcall FreeMem
  811.             bra     EndE
  812.  
  813. *
  814. * open up a directory for reading
  815. *
  816. _OpenUpDir: movem.l d2/a2-a3/a6,-(sp)
  817.             move.l  20(sp),a2
  818.             move.l  gl_Freq(a2),a3
  819.             move.l  fr_Directory(a3),a3
  820.             move.l  a3,a0
  821.             bsr     CloseDir
  822.             move.l  a3,a0
  823.             bsr     FreeDir
  824.             clr.l   gl_Displayed(a2)
  825.             clr.w   gl_NumEntries(a2)
  826.             clr.w   gl_IsSorted(a2)
  827.             movem.l d2-d5/a2,-(sp)
  828.             move.l  gl_Prop(a2),a0
  829.             move.l  gl_Window(a2),a1
  830.             cladr   a2
  831.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  832.             cldat   d1
  833.             cldat   d2
  834.             move.l  #$ffff,d3
  835.             move.l  #$ffff,d4
  836.             moveq   #1,d5
  837.             move.l  _IntuitionBase,a6
  838.             libcall NewModifyProp
  839.             movem.l (sp)+,d2-d5/a2
  840.             move.l  a3,a0
  841.             move.l  gl_DrawerBuf(a2),a1
  842.             bsr     OpenDir
  843.             tst.l   d0
  844.             bne.s   DirOK
  845.             bra.s   OPENERROR
  846. DirOK:      move.l  gl_Freq(a2),a0
  847.             move.w  fr_Flags(a0),d0
  848.             btst    #1,d0
  849.             bne.s   FNS
  850.             move.l  a3,-(sp)
  851.             bsr     _ReadDevs
  852.             addq.w  #4,sp
  853.             move.w  d0,gl_NumEntries(a2)
  854.             tst.l   d0
  855.             bne.s   FNS
  856.             pea     nomem
  857.             move.l  a2,-(sp)
  858.             bsr     _Error
  859.             addq.w  #8,sp
  860.             bra.s   OPENERROR
  861. FNS:        move.l  #1,gl_IsNext(a2)
  862. EndOD:      movem.l (sp)+,d2/a2-a3/a6
  863.             rts
  864. OPENERROR:  move.l  _IntuitionBase,a6
  865.             cladr   a0
  866.             libcall DisplayBeep
  867.             move.l  a3,a0
  868.             bsr     CloseDir
  869.             move.l  a3,a0
  870.             bsr     FreeDir
  871.             move.l  gl_Freq(a2),a0
  872.             move.w  fr_Flags(a0),d0
  873.             btst    #1,d0
  874.             bne.s   NoDvs
  875.             move.l  a3,-(sp)
  876.             bsr     _ReadDevs
  877.             addq.w  #4,sp
  878.             move.w  d0,gl_NumEntries(a2)
  879.             tst.l   d0
  880.             bne.s   NoDvs
  881.             pea     nomem
  882.             move.l  a2,-(sp)
  883.             bsr     _Error
  884.             addq.w  #8,sp
  885. NoDvs:      clr.l   gl_IsNext(a2)
  886.             move.l  a2,-(sp)
  887.             bsr     _SetProp
  888.             addq.w  #4,sp
  889.             pea     0
  890.             move.l  a2,-(sp)
  891.             bsr     _PrintDir
  892.             addq.w  #8,sp
  893.             bra.s   EndOD
  894.  
  895. *
  896. * read an entry of a directory
  897. *
  898. _GetNext:   movem.l d2-d3/a2-a3/a6,-(sp)
  899.             move.l  24(sp),a2
  900.             move.l  gl_Freq(a2),a0
  901.             move.l  fr_Directory(a0),d3
  902.             move.l  d3,a0
  903.             bsr     GetEntry
  904.             move.l  d0,a3
  905.             beq     NoNext
  906.  
  907.             moveq   #NO_CASE,d0
  908.             lea.l   gl_Pattern(a2),a1
  909.             lea.l   ei_Name(a3),a0
  910.             bsr     MatchPattern
  911.             tst.l   d0
  912.             beq     NoMatch
  913.             move.l  gl_Freq(a2),a1
  914.             move.l  fr_DontShow(a1),a0
  915.             bsr     StrLen
  916.             tst.l   d0
  917.             beq.s   NoNoShow
  918.  
  919.             moveq   #NO_CASE,d0
  920.             move.l  fr_DontShow(a1),a1
  921.             lea.l   ei_Name(a3),a0
  922.             bsr     MatchPattern
  923.             tst.l   d0
  924.             bne     NoMatch
  925. NoNoShow:   add.w   #1,gl_NumEntries(a2)
  926.             move.l  a2,-(sp)
  927.             bsr     _SetProp
  928.             addq.w  #4,sp
  929.             add.l   #1,gl_Displayed(a2)
  930.             cmp.l   #9,gl_Displayed(a2)
  931.             bge.s   NoDisp
  932.             move.l  a2,-(sp)
  933.             bsr     _PPos
  934.             addq.w  #4,sp
  935.             move.l  d0,-(sp)
  936.             move.l  a2,-(sp)
  937.             bsr     _PrintDir
  938.             addq.w  #8,sp
  939.             bra.s   NoDisp
  940. NoMatch:
  941.             move.l  a3,a1
  942.             REMOVE
  943.             move.l  d3,a0
  944.             move.l  a3,a1
  945.             sub.l   #1,dr_NumEntries(a0)
  946.             move.l  #ei_SIZEOF,d0
  947.             lea.l   dr_DirMem(a0),a0
  948.             bsr     FreeItem
  949. NoDisp:     move.l  #1,gl_IsNext(a2)
  950. EndGN:      movem.l (sp)+,d2-d3/a2-a3/a6
  951.             rts
  952. NoNext:
  953.             move.l  _DOSBase,a6
  954.             libcall IoErr
  955.             cmp.l   #ERROR_NO_MORE_ENTRIES,d0
  956.             beq.s   HaveAll
  957.             pea     0
  958.             move.l  a2,-(sp)
  959.             bsr     _Error
  960.             addq.w  #8,sp
  961.             bra.s   DIRERROR
  962. HaveAll:
  963. ULock:      move.l  d3,a0
  964.             bsr     CloseDir
  965. Clse:       clr.b   gl_Pattern(a2)
  966.             clr.l   gl_IsNext(a2)
  967.             move.l  a2,-(sp)
  968. MsgS:       bsr     _DoMsg
  969.             tst.l   d0
  970.             bne.s   MsgS
  971.             addq.w  #4,sp
  972.             move.l  a2,-(sp)
  973.             bsr     _PPos
  974.             addq.w  #4,sp
  975.             move.l  d0,-(sp)
  976.             move.l  a2,-(sp)
  977.             bsr     _PrintDir
  978.             addq.w  #8,sp
  979.             bra     EndGN
  980. DIRERROR:
  981.             move.l  _IntuitionBase,a6
  982.             cladr   a0
  983.             libcall DisplayBeep
  984.             move.l  d3,a0
  985.             bsr     CloseDir
  986.             move.l  d3,a0
  987.             bsr     FreeDir
  988.             move.l  gl_Freq(a2),a0
  989.             move.w  fr_Flags(a0),d0
  990.             btst    #1,d0
  991.             beq.s   Clse
  992.             move.l  d3,-(sp)
  993.             bsr     _ReadDevs
  994.             addq.w  #4,sp
  995.             move.w  d0,gl_NumEntries(a2)
  996.             tst.l   d0
  997.             bne.s   Clse
  998.             pea     nomem
  999.             move.l  a2,-(sp)
  1000.             bsr     _Error
  1001.             addq.w  #8,sp
  1002. NoDe:       bra     Clse
  1003.  
  1004. *
  1005. * set the proportional gadget according to the number of entries
  1006. *
  1007. _SetProp:   movem.l d2-d5/a2/a6,-(sp)
  1008.             move.l  28(sp),a2
  1009.             cldat   d4
  1010.             cldat   d2
  1011.             move.l  gl_PInfo(a2),a0
  1012.             move.w  pi_VertPot(a0),d2
  1013.             cmp.w   #8,gl_NumEntries(a2)
  1014.             bhi.s   NotSmall
  1015.             move.w  #$ffff,d4
  1016.             bra.s   SetIt
  1017. NotSmall:   cmp.w   #9,gl_NumEntries(a2)
  1018.             bne.s   NotEQ
  1019.             move.w  #$08000,d4
  1020.             bra.s   SetIt
  1021. NotEQ:      move.w  gl_NumEntries(a2),d0
  1022.             subq.w  #8,d0
  1023.             move.l  #$ffff,d4
  1024.             divu    d0,d4
  1025.             swap    d4
  1026.             clr.w   d4
  1027.             swap    d4
  1028. SetIt:      move.l  _IntuitionBase,a6
  1029.             move.l  gl_Prop(a2),a0
  1030.             move.l  gl_Window(a2),a1
  1031.             cladr   a2
  1032.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  1033.             cldat   d1
  1034.             move.l  #$ffff,d3
  1035.             moveq   #1,d5
  1036.             libcall NewModifyProp
  1037. EndSPR:     movem.l (sp)+,d2-d5/a2/a6
  1038.             rts
  1039.  
  1040. *
  1041. * find a EntryInfo structure
  1042. *
  1043. _GetEntryInfo:
  1044.             movem.l d2-d3/a2,-(sp)
  1045.             move.l  16(sp),a2
  1046.             move.l  20(sp),d2
  1047.             move.l  dr_First(a2),a1
  1048.             bra.s   CGL
  1049. GLoop:      move.l  ei_Next(a1),a1
  1050. CGL:        dbra    d2,GLoop
  1051. HaveIt:     move.l  a1,d0
  1052. EndGMI:     movem.l (sp)+,d2-d3/a2
  1053.             rts
  1054.  
  1055. *
  1056. * set the frontpen
  1057. *
  1058. setpen:     move.l  _GfxBase,a6
  1059.             move.l  gl_RPort(a2),a1
  1060.             moveq   #1,d0
  1061.             libcall SetAPen
  1062.             rts
  1063. *
  1064. * print the directory
  1065. *
  1066. _PrintDir:  movem.l d2-d6/a2-a3/a5-a6,-(sp)
  1067.             move.l  40(sp),a2
  1068.             move.l  44(sp),d0
  1069.             tst.w   gl_NumEntries(a2)
  1070.             bne.s   HaveEnt
  1071. EndPD:      movem.l (sp)+,d2-d6/a2-a3/a5-a6
  1072.             rts
  1073. HaveEnt:    cldat   d2
  1074.             cldat   d3
  1075.             moveq   #13,d4
  1076.             move.w  gl_NumEntries(a2),d3
  1077.             sub.l   d0,d3
  1078.             cmp.l   #9,d3
  1079.             blt.s   LessTE
  1080.             moveq   #8,d3
  1081. LessTE:     move.l  d0,-(sp)
  1082.             move.l  gl_Freq(a2),a0
  1083.             move.l  fr_Directory(a0),-(sp)
  1084.             bsr     _GetEntryInfo
  1085.             addq.w  #8,sp
  1086.             move.l  d0,gl_FirstDisplayed(a2)
  1087.             move.l  d0,a3
  1088. PLoop:      bsr     setpen
  1089.             move.l  a3,a5
  1090.             cmp.w   #ENTRY_DEV,ei_Type(a5)
  1091.             bne.s   NotADev
  1092.             move.l  gl_RPort(a2),a0
  1093.             move.l  gl_Disk(a2),a1
  1094.             moveq   #5,d0
  1095.             move.l  d4,d1
  1096.             move.l  _IntuitionBase,a6
  1097.             libcall DrawImage
  1098.             bra.s   SetUPD
  1099. NotADev:    cmp.w   #ENTRY_DIR,ei_Type(a5)
  1100.             bne.s   IsAFile
  1101.             move.l  gl_RPort(a2),a0
  1102.             move.l  gl_Drawer(a2),a1
  1103.             moveq   #5,d0
  1104.             move.l  d4,d1
  1105.             move.l  _IntuitionBase,a6
  1106.             libcall DrawImage
  1107. SetUPD:     movem.l d2-d3,-(sp)
  1108.             move.l  gl_RPort(a2),a1
  1109.             move.l  #42,d0
  1110.             move.l  d4,d1
  1111.             move.l  #44,d2
  1112.             move.l  d4,d3
  1113.             addq.l  #8,d3
  1114.             move.l  _GfxBase,a6
  1115.             libcall RectFill
  1116.             movem.l (sp)+,d2-d3
  1117.             move.l  #23,d6
  1118.             move.l  #44,d5
  1119.             bra.s   DoName
  1120. IsAFile:    moveq   #5,d5
  1121.             move.l  #28,d6
  1122. DoName:     lea.l   ei_Name(a5),a0
  1123.             move.b  (a0,d6.l),-(sp)
  1124.             clr.b   (a0,d6.l)
  1125.             pea     RP_JAM2
  1126.             pea     1
  1127.             pea     2
  1128.             move.l  d4,-(sp)
  1129.             move.l  d5,-(sp)
  1130.             move.l  a0,-(sp)
  1131.             move.l  gl_RPort(a2),-(sp)
  1132.             bsr     _Print
  1133.             lea.l   28(sp),sp
  1134.             lea.l   ei_Name(a5),a0
  1135.             move.b  (sp)+,(a0,d6.l)
  1136.             bsr     StrLen
  1137.             mulu    #8,d0
  1138.             add.l   d0,d5
  1139.             cmp.l   #232,d5
  1140.             bge.s   NoClear
  1141.             bsr     setpen
  1142.             movem.l d2-d3,-(sp)
  1143.             move.l  gl_RPort(a2),a1
  1144.             move.l  d5,d0
  1145.             move.l  d4,d1
  1146.             move.l  #233,d2
  1147.             move.l  d4,d3
  1148.             addq.l  #8,d3
  1149.             libcall RectFill
  1150.             movem.l (sp)+,d2-d3
  1151. NoClear:    move.l  ei_Next(a3),a3
  1152.             add.l   #10,d4
  1153.             inc.l   d2
  1154.             cmp.l   d3,d2
  1155.             bne     PLoop
  1156.             cmp.l   #8,d2
  1157.             bge     EndPD
  1158.             bsr     setpen
  1159.             move.l  gl_RPort(a2),a1
  1160.             moveq   #4,d0
  1161.             move.l  d4,d1
  1162.             move.l  #233,d2
  1163.             move.l  #91,d3
  1164.             libcall RectFill
  1165.             bra     EndPD
  1166.  
  1167. *
  1168. * increase prop position by "x"
  1169. *
  1170. _AddProp:   movem.l d2-d5/a2/a6,-(sp)
  1171.             move.l  28(sp),a2
  1172.             move.l  32(sp),d3
  1173.             cmp.w   #8,gl_NumEntries(a2)
  1174.             bge.s   AddIt
  1175. RF:         cldat   d0
  1176. EndAP:      movem.l (sp)+,d2-d5/a2/a6
  1177.             rts
  1178. AddIt:      cldat   d2
  1179.             cldat   d4
  1180.             move.l  gl_PInfo(a2),a0
  1181.             move.w  pi_VertPot(a0),d2
  1182.             move.w  pi_VertBody(a0),d4
  1183.             cmp.l   #$ffff,d2
  1184.             beq.s   RF
  1185.             move.l  d4,d0
  1186.             mulu    d3,d0
  1187.             add.l   d0,d2
  1188.             cmp.l   #$ffff,d2
  1189.             bmi.s   NoMax
  1190.             move.l  #$ffff,d2
  1191. NoMax:      move.l  _IntuitionBase,a6
  1192.             move.l  gl_Prop(a2),a0
  1193.             move.l  gl_Window(a2),a1
  1194.             cladr   a2
  1195.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  1196.             cldat   d1
  1197.             move.l  #$ffff,d3
  1198.             moveq   #1,d5
  1199.             libcall NewModifyProp
  1200.             moveq   #1,d0
  1201.             bra.s   EndAP
  1202.  
  1203. *
  1204. * decrease the prop position by "x"
  1205. *
  1206. _SubProp:   movem.l d2-d5/a2/a6,-(sp)
  1207.             move.l  28(sp),a2
  1208.             move.l  32(sp),d3
  1209.             cmp.w   #8,gl_NumEntries(a2)
  1210.             bge.s   SubIt
  1211. RFA:        cldat   d0
  1212. EndSP:      movem.l (sp)+,d2-d5/a2/a6
  1213.             rts
  1214. SubIt:      cldat   d2
  1215.             cldat   d4
  1216.             move.l  gl_PInfo(a2),a0
  1217.             move.w  pi_VertPot(a0),d2
  1218.             move.w  pi_VertBody(a0),d4
  1219.             tst.l   d2
  1220.             beq.s   RFA
  1221.             move.l  d4,d0
  1222.             mulu    d3,d0
  1223.             sub.l   d0,d2
  1224.             tst.l   d2
  1225.             bpl.s   NoMin
  1226.             cldat   d2
  1227. NoMin:      move.l  _IntuitionBase,a6
  1228.             move.l  gl_Prop(a2),a0
  1229.             move.l  gl_Window(a2),a1
  1230.             cladr   a2
  1231.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  1232.             cldat   d1
  1233.             move.l  #$ffff,d3
  1234.             moveq   #1,d5
  1235.             libcall NewModifyProp
  1236.             moveq   #1,d0
  1237.             bra.s   EndSP
  1238.  
  1239. *
  1240. * a gadget in the fileselection block was selected. look what the type of
  1241. * entry the gadget was and take appropiate action.
  1242. *
  1243. _DoFSel:    movem.l d2/a2-a3/a5-a6,-(sp)
  1244.             move.l  24(sp),a2
  1245.             cldat   d2
  1246.             move.w  gl_Id(a2),d2
  1247.             subq.w  #8,d2
  1248.             cmp.w   gl_NumEntries(a2),d2
  1249.             bcs.s   NumOK
  1250. EndDF:      movem.l (sp)+,d2/a2-a3/a5-a6
  1251.             rts
  1252. NumOK:      move.l  gl_FirstDisplayed(a2),a3
  1253.             bra.s   Test
  1254. Loop:       move.l  ei_Next(a3),a3
  1255. Test:       dbra    d2,Loop
  1256.             move.l  _IntuitionBase,a6
  1257.             move.l  a3,a5
  1258.             cmp.w   #ENTRY_FILE,ei_Type(a5)
  1259.             bne.s   NotAFile
  1260.             move.l  gl_FileBuf(a2),a0
  1261.             lea.l   ei_Name(a5),a1
  1262.             bsr     StrCpy
  1263.             move.l  gl_FileG(a2),a0
  1264.             move.l  gl_Window(a2),a1
  1265.             cladr   a2
  1266.             moveq   #1,d0
  1267.             libcall RefreshGList
  1268.             bra.s   EndDF
  1269. NotAFile:   cmp.w   #ENTRY_DIR,ei_Type(a5)
  1270.             bne.s   MustBeADev
  1271.             move.l  gl_DrawerBuf(a2),a0
  1272.             bsr     StrLen
  1273.             dec.w   a0
  1274.             lea.l   ei_Name(a5),a1
  1275.             bsr     StrCpy
  1276.             move.b  #'/',(a0)+
  1277.             clr.b   (a0)
  1278.             bra.s   Refr
  1279. MustBeADev: move.l  gl_DrawerBuf(a2),a0
  1280.             lea.l   ei_Name(a5),a1
  1281.             bsr     StrCpy
  1282. Refr:       move.l  a2,-(sp)
  1283.             move.l  gl_DirG(a2),a0
  1284.             move.l  gl_Window(a2),a1
  1285.             cladr   a2
  1286.             moveq   #1,d0
  1287.             libcall RefreshGList
  1288.             move.l  (sp),a2
  1289.             lea.l   gl_Pattern(a2),a0
  1290.             clr.b   (a0)
  1291.             bsr     _OpenUpDir
  1292.             addq.w  #4,sp
  1293.             bra     EndDF
  1294. *
  1295. * append a '/' to the pathname if neacecary
  1296. *
  1297. _UpDatePath:
  1298.             move.l  a2,-(sp)
  1299.             move.l  8(sp),a2
  1300.             move.l  gl_DrawerBuf(a2),a0
  1301.             bsr     StrLen
  1302.             tst.l   d0
  1303.             beq.s   NoUDP
  1304.             subq.w  #2,a0
  1305.             cmp.b   #':',(a0)
  1306.             beq.s   NoUDP
  1307.             cmp.b   #'/',(a0)
  1308.             beq.s   NoUDP
  1309.             inc.w   a0
  1310.             move.b  #'/',(a0)+
  1311.             clr.b   (a0)
  1312. NoUDP:      move.l  (sp)+,a2
  1313.             rts
  1314.  
  1315. *
  1316. * read the parent directory of the current directory
  1317. *
  1318. _Parent:    movem.l a2/a6,-(sp)
  1319.             move.l  12(sp),a2
  1320.             move.l  gl_DrawerBuf(a2),a0
  1321.             bsr     StrLen
  1322.             tst.l   d0
  1323.             bne.s   HavePath
  1324. FALSE:      cldat   d0
  1325. EndP:       movem.l (sp)+,a2/a6
  1326.             rts
  1327. HavePath:   subq.w  #2,a0
  1328.             cmp.b   #':',(a0)
  1329.             beq.s   FALSE
  1330.             dec.w   a0
  1331. Search:     move.b   -(a0),d0
  1332.             cmp.b   #':',d0
  1333.             beq.s   GotPar
  1334.             cmp.b   #'/',d0
  1335.             bne.s   Search
  1336. GotPar:     inc.w   a0
  1337.             clr.b   (a0)
  1338.             move.l  gl_DirG(a2),a0
  1339.             move.l  gl_Window(a2),a1
  1340.             cladr   a2
  1341.             moveq   #1,d0
  1342.             move.l  _IntuitionBase,a6
  1343.             libcall RefreshGList
  1344.             moveq   #1,d0
  1345.             bra.s   EndP
  1346.  
  1347. *
  1348. * lock the caller window its IDCMP with a small requester
  1349. *
  1350. _LockCaller:
  1351.             movem.l a2-a3/a6,-(sp)
  1352.             move.l  16(sp),a2
  1353.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  1354.             move.l  #rq_SIZEOF,d0
  1355.             lea.l   gl_Misc(a2),a0
  1356.             bsr     AllocItem
  1357.             move.l  d0,a3
  1358.             bne.s   GotReq
  1359. EndLC:      movem.l (sp)+,a2-a3/a6
  1360.             rts
  1361. GotReq:     move.l  _IntuitionBase,a6
  1362.             move.l  a3,a0
  1363.             libcall InitRequester
  1364.             move.w  #1,rq_Width(a3)
  1365.             move.w  #1,rq_Height(a3)
  1366.             move.l  _GfxBase,a6
  1367.             move.l  gl_Freq(a2),a1
  1368.             move.l  fr_Caller(a1),a1
  1369.             move.l  wd_RPort(a1),a1
  1370.             cldat   d0
  1371.             cldat   d1
  1372.             libcall ReadPixel
  1373.             move.b  d0,rq_BackFill(a3)
  1374.             move.l  _IntuitionBase,a6
  1375.             move.l  a3,a0
  1376.             move.l  gl_Freq(a2),a1
  1377.             move.l  fr_Caller(a1),a1
  1378.             libcall Request
  1379.             tst.l   d0
  1380.             beq.s   EndLC
  1381.             move.l  a3,gl_WindowLock(a2)
  1382.             bra.s   EndLC
  1383.  
  1384. *
  1385. * remove the requester
  1386. *
  1387. _UnLockCaller:
  1388.             movem.l a2/a6,-(sp)
  1389.             move.l  12(sp),a2
  1390.             tst.l   gl_WindowLock(a2)
  1391.             bne.s   CanCL
  1392. EndULC:     movem.l (sp)+,a2/a6
  1393.             rts
  1394. CanCL:      move.l  _IntuitionBase,a6
  1395.             move.l  gl_WindowLock(a2),a0
  1396.             move.l  gl_Freq(a2),a1
  1397.             move.l  fr_Caller(a1),a1
  1398.             libcall EndRequest
  1399.             bra.s   EndULC
  1400.  
  1401. MODE_READWRITE      EQU     1004        ;  'libraries/dos.i' ?!?!?!?!
  1402. *
  1403. * end the filerequester and open the selected file if requested
  1404. *
  1405. _TheEnd:    link    a5,#-256
  1406.             movem.l d2-d4/a2-a3/a6,-(sp)
  1407.             move.l  8(a5),a2
  1408.             move.l  12(a5),d2
  1409.             move.l  gl_Freq(a2),a3
  1410.             cldat   d3
  1411.             move.w  fr_Flags(a3),d3
  1412.             moveq   #1,d4
  1413.             lea.l   -256(a5),a0
  1414.             move.l  gl_DrawerBuf(a2),a1
  1415.             bsr     StrCpy
  1416.             move.l  gl_FileBuf(a2),a1
  1417.             bsr     StrCpy
  1418.             move.l  d3,d0
  1419.             btst    #3,d0
  1420.             beq.s   NoCC
  1421.             move.l  a2,-(sp)
  1422.             bsr     _DoColors
  1423.             addq.w  #4,sp
  1424. NoCC:       move.l  fr_Directory(a3),a0
  1425.             bsr     CloseDir
  1426.             btst    #0,d3
  1427.             beq.s   DoPR
  1428.             move.l  fr_Directory(a3),a0
  1429.             bsr     FreeDir
  1430. DoPR:       tst.l   gl_IsNext(a2)           ; if the requester wasn't ready
  1431.             beq.s   DoOpen                  ; reading the directory the dir
  1432.             move.l  fr_Directory(a3),a0     ; is freed wheter FR_NoPreserve
  1433.             bsr     FreeDir                 ; is set or not.
  1434. DoOpen:     move.l  _DOSBase,a6
  1435.             cmp.l   #FREQ_CANCELED,d2
  1436.             beq.s   OpenDone
  1437.             btst    #4,d3
  1438.             beq.s   NoOld
  1439.             btst    #5,d3
  1440.             bne.s   DoVoid
  1441.             btst    #6,d3
  1442.             bne.s   DoVoid
  1443.             move.l  #MODE_OLDFILE,d2
  1444.             bra.s   OpenIt
  1445. NoOld:      btst    #5,d3
  1446.             beq.s   NoNew
  1447.             btst    #4,d3
  1448.             bne.s   DoVoid
  1449.             btst    #6,d3
  1450.             bne.s   DoVoid
  1451.             move.l  #MODE_NEWFILE,d2
  1452.             bra.s   OpenIt
  1453. NoNew:      btst    #6,d3
  1454.             beq.s   DoVoid
  1455.             btst    #5,d3
  1456.             bne.s   DoVoid
  1457.             btst    #4,d3
  1458.             bne.s   DoVoid
  1459.             move.l  #MODE_READWRITE,d2
  1460. OpenIt:     lea.l   -256(a5),a0
  1461.             move.l  a0,d1
  1462.             libcall Open
  1463.             move.l  d0,fr_Handle(a3)
  1464.             tst.l   d0
  1465.             bne.s   OpenDone
  1466.             cldat   d4
  1467.             bra.s   OpenDone
  1468. DoVoid:     clr.l   fr_Handle(a3)
  1469. OpenDone:   move.l  _GfxBase,a6
  1470.             move.l  gl_Font(a2),a1
  1471.             libcall CloseFont
  1472.             move.l  gl_Proc(a2),a0
  1473.             move.l  gl_PRWindow(a2),pr_WindowPtr(a0)
  1474.             move.l  gl_Window(a2),a0
  1475.             move.l  _IntuitionBase,a6
  1476.             libcall CloseWindow
  1477.             tst.l   fr_Caller(a3)
  1478.             beq.s   NoCL
  1479.             move.l  a2,-(sp)
  1480.             bsr     _UnLockCaller
  1481.             addq.w  #4,sp
  1482. NoCL:       lea.l   gl_Misc(a2),a0
  1483.             bsr     FreeMemoryChain
  1484.             move.l  gl_TimeDelay(a2),a0
  1485.             bsr     DeleteTimeDelay
  1486.             move.l  d4,d0
  1487.             movem.l (sp)+,d2-d4/a2-a3/a6
  1488.             unlk    a5
  1489.             rts
  1490.  
  1491.  
  1492. *
  1493. * the main routine
  1494. *
  1495.             xdef    FileRequest
  1496.  
  1497. FileRequest:
  1498.             movem.l d2-d5/a2-a3/a6,-(sp)
  1499.             move.l  a0,a3
  1500.  
  1501.             cldat   d2
  1502.             cldat   d3
  1503.  
  1504.             move.l  (_SysBase).w,a6
  1505.             move.l  #gl_SIZEOF,d0
  1506.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  1507.             libcall AllocMem
  1508.             move.l  d0,a2
  1509.             bne.s   GotGlob
  1510.  
  1511.             moveq   #FREQ_CANT_OPEN,d0
  1512. EndFR:      movem.l (sp)+,d2-d5/a2-a3/a6
  1513.             rts
  1514. GotGlob:
  1515.             move.l  a3,gl_Freq(a2)
  1516.             move.l  fr_FileName(a3),gl_FileBuf(a2)
  1517.             move.l  fr_DirName(a3),gl_DrawerBuf(a2)
  1518.  
  1519.             lea.l   gl_Misc(a2),a0
  1520.             move.l  #1024,d0
  1521.             bsr     InitMemoryChain
  1522.  
  1523.             tst.l   fr_Caller(a3)
  1524.             beq.s   NoCaller
  1525.             move.l  a2,-(sp)
  1526.             bsr     _LockCaller
  1527.             addq.w  #4,sp
  1528. NoCaller:
  1529.             clr.w   gl_IsSorted(a2)
  1530.  
  1531.             move.l  a2,-(sp)
  1532.             bsr     _GetFSWindow
  1533.             addq.w  #4,sp
  1534.             tst.l   d0
  1535.             beq     FreqFailed
  1536.  
  1537.             move.l  gl_Window(a2),a0
  1538.             move.l  wd_UserPort(a0),a0
  1539.             cldat   d0
  1540.             move.l  #100000,d1
  1541.             bsr     CreateTimeDelay
  1542.             move.l  d0,gl_TimeDelay(a2)
  1543.             beq     FreqFailed
  1544.  
  1545.             lea.l   gl_Pattern(a2),a1
  1546.             move.l  fr_DirName(a3),a0
  1547.             bsr     Isolate
  1548.  
  1549.             move.l  a2,-(sp)
  1550.             bsr     _UpDatePath
  1551.             addq.w  #4,sp
  1552.  
  1553.             move.l  fr_Directory(a3),a0
  1554.             tst.l   dr_NumEntries(a0)
  1555.             beq.s   NewDir
  1556.             move.l  dr_First(a0),gl_FirstDisplayed(a2)
  1557.             move.w  dr_NumEntries+2(a0),gl_NumEntries(a2)
  1558.             move.l  a2,-(sp)
  1559.             bsr     _SetProp
  1560.             addq.w  #4,sp
  1561.             move.l  #0,gl_IsNext(a2)
  1562.             bra.s   PrintIt
  1563. NewDir:
  1564.             move.l  a2,-(sp)
  1565.             bsr     _OpenUpDir
  1566.             addq.w  #4,sp
  1567. PrintIt:
  1568.             pea     0
  1569.             move.l  a2,-(sp)
  1570.             bsr     _PrintDir
  1571.             addq.w  #8,sp
  1572.  
  1573. FOREVER:
  1574.             tst.l   gl_IsNext(a2)
  1575.             beq.s   Wait
  1576.             move.l  a2,-(sp)
  1577.             bsr     _GetNext
  1578.             addq.w  #4,sp
  1579.             bra.s   Eval
  1580. Wait:
  1581.             move.l  (_SysBase).w,a6
  1582.             move.l  gl_Window(a2),a0
  1583.             move.l  wd_UserPort(a0),a0
  1584.             libcall WaitPort
  1585.  
  1586.             move.l  a2,-(sp)
  1587.             bsr     _DoMsg
  1588.             addq.w  #4,sp
  1589.             tst.w   gl_IsSorted(a2)
  1590.             bne.s   Evals
  1591.             cmp.w   #7,gl_Id(a2)
  1592.             bhi.s   Evals
  1593.             cldat   d0
  1594.             move.w  fr_Flags(a3),d0
  1595.             btst.l  #2,d0
  1596.             bne.s   Evals
  1597.             move.l  fr_Directory(a3),-(sp)
  1598.             bsr     _SortNames
  1599.             addq.w  #4,sp
  1600.             move.l  a2,-(sp)
  1601.             bsr     _PPos
  1602.             addq.w  #4,sp
  1603.             move.l  d0,-(sp)
  1604.             move.l  a2,-(sp)
  1605.             bsr     _PrintDir
  1606.             addq.w  #8,sp
  1607.             move.w  #1,gl_IsSorted(a2)
  1608.             bra.s   Evals
  1609. Eval:
  1610.             move.l  a2,-(sp)
  1611.             bsr     _DoMsg
  1612.             addq.w  #4,sp
  1613.             tst.l   d0
  1614.             beq     FOREVER
  1615. Evals:      cmp.l   #CLOSEWINDOW,gl_Class(a2)
  1616.             bne.s   NoCLW
  1617.             bra     CloseW
  1618. NoCLW:      cmp.l   #MOUSEBUTTONS,gl_Class(a2)
  1619.             bne.s   NotMB
  1620.             cmp.w   #MENUDOWN,gl_Code(a2)
  1621.             bne.s   Eval
  1622.             movem.l d2-d5/a2,-(sp)
  1623.             cldat   d4
  1624.             move.l  gl_PInfo(a2),a0
  1625.             move.w  pi_VertBody(a0),d4
  1626.             move.l  _IntuitionBase,a6
  1627.             move.l  gl_Prop(a2),a0
  1628.             move.l  gl_Window(a2),a1
  1629.             cladr   a2
  1630.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  1631.             cldat   d1
  1632.             cldat   d2
  1633.             move.l  #$ffff,d3
  1634.             moveq   #1,d5
  1635.             libcall NewModifyProp
  1636.             movem.l (sp)+,d2-d5/a2
  1637.             cldat   d2
  1638.             pea     0
  1639.             move.l  a2,-(sp)
  1640.             bsr     _PrintDir
  1641.             addq.w  #8,sp
  1642.             bra.s   Eval
  1643. NotMB:
  1644.             cmp.l   #MOUSEMOVE,gl_Class(a2)
  1645.             bne.s   NotMM
  1646.             bsr     PropB
  1647.             bra     Eval
  1648. NotMM:
  1649.             cmp.l   #GADGETDOWN,gl_Class(a2)
  1650.             bne.s   NoGD
  1651.             cmp.w   #5,gl_Id(a2)
  1652.             bne.s   NotProp
  1653.             bsr     PropB
  1654.             bra     Eval
  1655. NotProp:    cmp.w   #6,gl_Id(a2)
  1656.             bne.s   NotDown
  1657.             bsr     Down
  1658.             bra     Eval
  1659. NotDown:    cmp.w   #7,gl_Id(a2)
  1660.             bne     Eval
  1661.             bsr     Up
  1662.             bra     Eval
  1663. NoGD:
  1664.             cmp.l   #GADGETUP,gl_Class(a2)
  1665.             bne.s   NotGU
  1666.             cmp.w   #8,gl_Id(a2)
  1667.             bmi.s   NoFS
  1668.             move.l  a2,-(sp)
  1669.             bsr     _DoFSel
  1670.             addq.w  #4,sp
  1671.             bra     Eval
  1672. NoFS:       tst.w   gl_Id(a2)
  1673.             bne.s   NoCNC
  1674.             bra     CloseW
  1675. NoCNC:      cmp.w   #1,gl_Id(a2)
  1676.             bne.s   NoPar
  1677.             bsr     Par
  1678.             bra     Eval
  1679. NoPar:      cmp.w   #2,gl_Id(a2)
  1680.             beq.s   DoOK
  1681.             cmp.w   #3,gl_Id(a2)
  1682.             bne.s   NoOK
  1683. DoOK:       bra     TryOK
  1684. NoOK:       cmp.w   #4,gl_Id(a2)
  1685.             bne     Eval
  1686.             bsr     NewPath
  1687.             bra     Eval
  1688. NotGU:      cmp.l   #RAWKEY,gl_Class(a2)
  1689.             bne     Eval
  1690.             tst.l   gl_IsNext(a2)
  1691.             bne     Eval
  1692.             move.w  gl_Code(a2),d0
  1693.             andi.w  #IECODE_UP_PREFIX,d0
  1694.             cmp.w   #IECODE_UP_PREFIX,d0
  1695.             beq     Eval
  1696.             cmp.w   #IEQUALIFIER_RELATIVEMOUSE,gl_Qualifier(a2)
  1697.             beq     Good
  1698.             cmp.w   #IEQUALIFIER_RELATIVEMOUSE+IEQUALIFIER_CAPSLOCK,gl_Qualifier(a2)
  1699.             bne     Eval
  1700. Good:       cmp.w   #$5F,gl_Code(a2)
  1701.             bne     Eval
  1702.             move.l  a2,-(sp)
  1703.             bsr     _OpenUpDir
  1704.             addq.w  #4,sp
  1705.             bra     Eval
  1706. FreqFailed: tst.l   gl_WindowLock(a2)
  1707.             beq.s   NoWDL
  1708.             move.l  a2,-(sp)
  1709.             bsr     _UnLockCaller
  1710.             addq.w  #4,sp
  1711. NoWDL:      lea.l   gl_Misc(a2),a0
  1712.             bsr     FreeMemoryChain
  1713.             move.l  #gl_SIZEOF,d0
  1714.             move.l  a2,a1
  1715.             move.l  (_SysBase).w,a6
  1716.             libcall FreeMem
  1717.             moveq   #FREQ_CANT_OPEN,d0
  1718.             bra     EndFR
  1719.  
  1720. CloseW:     pea     FREQ_CANCELED
  1721.             move.l  a2,-(sp)
  1722.             bsr     _TheEnd
  1723.             addq.w  #8,sp
  1724.             move.l  #gl_SIZEOF,d0
  1725.             move.l  a2,a1
  1726.             move.l  (_SysBase).w,a6
  1727.             libcall FreeMem
  1728.             moveq   #FREQ_CANCELED,d0
  1729.             bra     EndFR
  1730.  
  1731. PropB:      move.l  gl_PInfo(a2),a0
  1732.             move.w  pi_Flags(a0),d0
  1733.             btst.l  #8,d0
  1734.             bne.s   PropM
  1735.             move.l  a2,-(sp)
  1736.             bsr     _PPos
  1737.             addq.w  #4,sp
  1738.             pea     6
  1739.             move.l  a2,-(sp)
  1740.             cmp.l   d0,d2
  1741.             beq.s   MsgL
  1742.             bhi.s   SubP
  1743.             bsr     _AddProp
  1744.             bra.s   SetU
  1745. SubP:       bsr     _SubProp
  1746. SetU:       addq.w  #8,sp
  1747.             move.l  a2,-(sp)
  1748.             bsr     _PPos
  1749.             addq.w  #4,sp
  1750.             move.l  d0,d2
  1751.             move.l  d0,-(sp)
  1752.             move.l  a2,-(sp)
  1753.             bsr     _PrintDir
  1754.             addq.w  #8,sp
  1755. MsgL:       move.l  a2,-(sp)
  1756.             bsr     _DoMsg
  1757.             addq.w  #4,sp
  1758.             tst.l   d0
  1759.             bne.s   MsgL
  1760.             rts
  1761.  
  1762. PropM:      move.l  a2,-(sp)
  1763.             bsr     _PPos
  1764.             addq.w  #4,sp
  1765.             move.l  d0,d3
  1766.             cmp.l   d2,d3
  1767.             beq.s   MsgL
  1768.             move.l  d3,-(sp)
  1769.             move.l  a2,-(sp)
  1770.             bsr     _PrintDir
  1771.             addq.w  #8,sp
  1772.             move.l  d3,d2
  1773. NoNxt:      bra.s   MsgL
  1774.  
  1775. Down:       cldat   d0
  1776.             move.l  gl_IAddress(a2),a0
  1777.             move.w  gg_Flags(a0),d0
  1778.             andi.w  #SELECTED,d0
  1779.             beq.s   NotSL
  1780.             pea     1
  1781.             move.l  a2,-(sp)
  1782.             bsr     _AddProp
  1783.             addq.w  #8,sp
  1784.             tst.l   d0
  1785.             beq.s   NotSL
  1786.             move.l  a2,-(sp)
  1787.             bsr     _PPos
  1788.             addq.w  #4,sp
  1789.             move.l  d0,d2
  1790.             move.l  d2,-(sp)
  1791.             move.l  a2,-(sp)
  1792.             bsr     _PrintDir
  1793.             addq.w  #8,sp
  1794. NotSL:      move.l  gl_TimeDelay(a2),a0
  1795.             bsr     DoTimeDelay
  1796.             move.l  a2,-(sp)
  1797.             bsr     _DoMsg
  1798.             addq.w  #4,sp
  1799.             tst.l   gl_IsNext(a2)
  1800.             beq.s   NoNxt1
  1801.             move.l  a2,-(sp)
  1802.             bsr     _GetNext
  1803.             addq.w  #4,sp
  1804. NoNxt1:     cmp.l   #GADGETUP,gl_Class(a2)
  1805.             beq.s   NoMoreD
  1806.             cmp.w   #SELECTUP,gl_Code(a2)
  1807.             bne.s   Down
  1808. NoMoreD:    move.l  a2,-(sp)
  1809.             bsr     _DoMsg
  1810.             addq.w  #4,sp
  1811.             tst.l   d0
  1812.             bne.s   NoMoreD
  1813.             rts
  1814.  
  1815. Up:         cldat   d0
  1816.             move.l  gl_IAddress(a2),a0
  1817.             move.w  gg_Flags(a0),d0
  1818.             andi.w  #SELECTED,d0
  1819.             beq.s   NotSL1
  1820.             pea     1
  1821.             move.l  a2,-(sp)
  1822.             bsr     _SubProp
  1823.             addq.w  #8,sp
  1824.             tst.l   d0
  1825.             beq.s   NotSL1
  1826.             move.l  a2,-(sp)
  1827.             bsr     _PPos
  1828.             addq.w  #4,sp
  1829.             move.l  d0,d2
  1830.             move.l  d2,-(sp)
  1831.             move.l  a2,-(sp)
  1832.             bsr     _PrintDir
  1833.             addq.w  #8,sp
  1834. NotSL1:     move.l  gl_TimeDelay(a2),a0
  1835.             bsr     DoTimeDelay
  1836.             move.l  a2,-(sp)
  1837.             bsr     _DoMsg
  1838.             addq.w  #4,sp
  1839.             tst.l   gl_IsNext(a2)
  1840.             beq.s   NoNxt2
  1841.             move.l  a2,-(sp)
  1842.             bsr     _GetNext
  1843.             addq.w  #4,sp
  1844. NoNxt2:     cmp.l   #GADGETUP,gl_Class(a2)
  1845.             beq.s   NoMoreU
  1846.             cmp.w   #SELECTUP,gl_Code(a2)
  1847.             bne.s   Up
  1848. NoMoreU:    move.l  a2,-(sp)
  1849.             bsr     _DoMsg
  1850.             addq.w  #4,sp
  1851.             tst.l   d0
  1852.             bne.s   NoMoreU
  1853.             rts
  1854.  
  1855. Par:        move.l  a2,-(sp)
  1856.             bsr     _Parent
  1857.             addq.w  #4,sp
  1858.             tst.l   d0
  1859.             beq.s   NoParent
  1860.             lea.l   gl_Pattern(a2),a0
  1861.             clr.b   (a0)
  1862.             move.l  a2,-(sp)
  1863.             bsr     _OpenUpDir
  1864.             addq.w  #4,sp
  1865.             move.l  a2,-(sp)
  1866.             bsr     _PPos
  1867.             addq.w  #4,sp
  1868.             move.l  d0,d2
  1869. NoParent:   rts
  1870.  
  1871. TryOK:      move.l  gl_FileBuf(a2),a0
  1872.             bsr     StrLen
  1873.             tst.l   d0
  1874.             beq     Eval
  1875.             pea     FREQ_OK
  1876.             move.l  a2,-(sp)
  1877.             bsr     _TheEnd
  1878.             addq.w  #8,sp
  1879.             move.l  d0,d5
  1880.             move.l  (_SysBase).w,a6
  1881.             move.l  a2,a1
  1882.             move.l  #gl_SIZEOF,d0
  1883.             libcall FreeMem
  1884.             tst.l   d5
  1885.             beq.s   RetF
  1886.             moveq   #FREQ_OK,d0
  1887.             bra     EndFR
  1888. RetF:       moveq   #FREQ_FILE_ERROR,d0
  1889.             bra     EndFR
  1890.  
  1891. NewPath:    lea.l   gl_Pattern(a2),a1
  1892.             move.l  gl_DrawerBuf(a2),a0
  1893.             bsr     Isolate
  1894.             move.l  a2,-(sp)
  1895.             bsr     _UpDatePath
  1896.             addq.w  #4,sp
  1897.             move.l  a2,-(sp)
  1898.             move.l  _IntuitionBase,a6
  1899.             move.l  gl_DirG(a2),a0
  1900.             move.l  gl_Window(a2),a1
  1901.             cladr   a2
  1902.             moveq   #1,d0
  1903.             libcall RefreshGList
  1904.             move.l  (sp),a2
  1905.             bsr     _OpenUpDir
  1906.             bsr     _PPos
  1907.             addq.w  #4,sp
  1908.             move.l  d0,d2
  1909.             rts
  1910.  
  1911. *
  1912. * Datas for the gadgets, window, texts e.c.t. This data get's read only.
  1913. *
  1914.         even
  1915. *
  1916. * The PropInfo structure.
  1917. *
  1918. PINFO:  dc.w    AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT
  1919.         dc.w    $0000,$0000,$ffff,$ffff,0,0,0,0,0,0
  1920.  
  1921. *
  1922. * The Image structures.
  1923. *
  1924. FSI:    dc.w    3,0,14,8,2
  1925.         dc.l    0
  1926.         dc.b    1,0
  1927.         dc.l    0
  1928.  
  1929.         dc.w    3,0,14,8,2
  1930.         dc.l    0
  1931.         dc.b    1,0
  1932.         dc.l    0
  1933.  
  1934.         dc.w    0,0,37,8,2
  1935.         dc.l    0
  1936.         dc.b    3,0
  1937.         dc.l    0
  1938.  
  1939.         dc.w    0,0,37,8,2
  1940.         dc.l    0
  1941.         dc.b    1,0
  1942.         dc.l    0
  1943. *
  1944. * The image data.
  1945. *
  1946. FSD:    dc.w    $FFFC,$8004,$C00C,$E01C,$F03C,$F87C,$FCFC,$FFFC
  1947.         dc.w    $FFFC,$FCFC,$F87C,$F03C,$E01C,$C00C,$8004,$FFFC
  1948.         dc.w    $FFFF,$FFFF,$F800,$8000,$0000,$0800,$BFFF,$FFFF
  1949.         dc.w    $E800,$BFE3,$FC7F,$E800,$BFF0,$003F,$E800,$BFFF
  1950.         dc.w    $FFFF,$E800,$8000,$0000,$0800,$FFFF,$FFFF,$F800
  1951.         dc.w    $FFF8,$01FF,$F800,$FFF8,$017F,$F800,$FFF8,$01FF
  1952.         dc.w    $F800,$FFF8,$01FF,$F800,$FFFF,$FFFF,$F800,$FFF8
  1953.         dc.w    $01FF,$F800,$FFFB,$01FF,$F800,$FFF8,$01FF,$F800
  1954.         dc.w    $003F,$FFC0,$0000,$003F,$FFC0,$0000,$003F,$FFC0
  1955.         dc.w    $0000,$003F,$FFC0,$0000,$003F,$FFC0,$0000,$0038
  1956.         dc.w    $01C0,$0000,$0038,$01C0,$0000,$0018,$01C0,$0000
  1957. *
  1958. * The FileRequester Gadgets.
  1959. *
  1960. FSG:    dc.l    0
  1961.         dc.w    180,122,68,11
  1962.         dc.w    GADGHCOMP
  1963.         dc.w    RELVERIFY
  1964.         dc.w    BOOLGADGET
  1965.         dc.l    0,0,0,0,0
  1966.         dc.w    0
  1967.         dc.l    0
  1968.  
  1969.         dc.l    0
  1970.         dc.w    96,122,68,11
  1971.         dc.w    GADGHCOMP
  1972.         dc.w    RELVERIFY
  1973.         dc.w    BOOLGADGET
  1974.         dc.l    0,0,0,0,0
  1975.         dc.w    1
  1976.         dc.l    0
  1977.  
  1978.         dc.l    0
  1979.         dc.w    12,122,68,11
  1980.         dc.w    GADGHCOMP
  1981.         dc.w    RELVERIFY
  1982.         dc.w    BOOLGADGET
  1983.         dc.l    0,0,0,0,0
  1984.         dc.w    2
  1985.         dc.l    0
  1986.  
  1987.         dc.l    0
  1988.         dc.w    64,109,184,8
  1989.         dc.w    GADGHCOMP
  1990.         dc.w    RELVERIFY
  1991.         dc.w    STRGADGET
  1992.         dc.l    0,0,0,0,0
  1993.         dc.w    3
  1994.         dc.l    0
  1995.  
  1996.         dc.l    0
  1997.         dc.w    64,97,184,8
  1998.         dc.w    GADGHCOMP
  1999.         dc.w    RELVERIFY
  2000.         dc.w    STRGADGET
  2001.         dc.l    0,0,0,0,0
  2002.         dc.w    4
  2003.         dc.l    0
  2004.  
  2005.         dc.l    0
  2006.         dc.w    239,23,14,58
  2007.         dc.w    GADGHCOMP
  2008.         dc.w    RELVERIFY+GADGIMMEDIATE+FOLLOWMOUSE
  2009.         dc.w    PROPGADGET
  2010.         dc.l    0,0,0,0,0
  2011.         dc.w    5
  2012.         dc.l    0
  2013.  
  2014.         dc.l    0
  2015.         dc.w    236,84,20,8
  2016.         dc.w    GADGHCOMP+GADGIMAGE
  2017.         dc.w    RELVERIFY+GADGIMMEDIATE
  2018.         dc.w    BOOLGADGET
  2019.         dc.l    0,0,0,0,0
  2020.         dc.w    6
  2021.         dc.l    0
  2022.  
  2023.         dc.l    0
  2024.         dc.w    236,12,20,8
  2025.         dc.w    GADGHCOMP+GADGIMAGE
  2026.         dc.w    RELVERIFY+GADGIMMEDIATE
  2027.         dc.w    BOOLGADGET
  2028.         dc.l    0,0,0,0,0
  2029.         dc.w    7
  2030.         dc.l    0
  2031. *
  2032. * The Gadget structure for the File-Selection block.
  2033. *
  2034. FGAD:   dc.l    0
  2035.         dc.w    4,12,230,10
  2036.         dc.w    GADGHCOMP
  2037.         dc.w    RELVERIFY
  2038.         dc.w    BOOLGADGET
  2039.         dc.l    0,0,0,0,0
  2040.         dc.w    0
  2041.         dc.l    0
  2042. *
  2043. * The FileRequester NewWindow structure.
  2044. *
  2045. fsnw:   dc.w    40,15,260,140
  2046.         dc.b    0,1
  2047.         dc.l    GADGETDOWN+GADGETUP+CLOSEWINDOW+MOUSEBUTTONS+MOUSEMOVE+RAWKEY
  2048.         dc.l    WINDOWDRAG+WINDOWCLOSE+ACTIVATE+RMBTRAP+NOCAREREFRESH
  2049.         dc.l    0,0,0,0,0
  2050.         dc.w    0,0,0,0,WBENCHSCREEN
  2051. *
  2052. * Various texts used.
  2053. *
  2054. fnam:   dc.b    'topaz.font',0
  2055. oktext: dc.b    'OK',0
  2056. cancel: dc.b    'CANCEL',0
  2057. parent: dc.b    'Parent',0
  2058. file:   dc.b    'File',0
  2059. drawer: dc.b    'Drawer',0
  2060. nomem:  dc.b    'Out of memory !',0
  2061. open:   dc.b    'Can',96,'t open this dir !',0
  2062.  
  2063.         even
  2064. *
  2065. * TextAttr structure (topaz 8)
  2066. *
  2067. TOPAZ_80:
  2068.         dc.l    fnam
  2069.         dc.w    TOPAZ_EIGHTY
  2070.         dc.b    FS_NORMAL,FPF_ROMFONT
  2071. *
  2072. * OK text for the error requester
  2073. *
  2074. ok:     dc.b    0,0,RP_JAM1,0           ; last byte is kludgefill
  2075.         dc.w    6,4
  2076.         dc.l    TOPAZ_80,oktext,0
  2077.  
  2078.         even
  2079.  
  2080.  
  2081.  
  2082.